//1. this 是静态的. this 始终指向函数声明时所在作用域下的 this 的值
function getName() {
  console.log(this)
}
// 箭头函数没有自己的this值，箭头函数中所使用的this来自于函数作用域链。
let getName2 = () => {
  console.log(this)
}

//设置 window 对象的 name 属性
// window.name = '谭梦寻';
const school = {
  name: 'ATGUIGU'
}

//直接调用 此时在全局作用域中执行时，this的值就是global对象
// 但是对于浏览器来说，this就是window
getName()
getName2()

//call 方法调用
// getName.call(school);
// getName2.call(school);

//2. 不能作为构造实例化对象
// let Person = (name, age) => {
//     this.name = name;
//     this.age = age;
// }
// let me = new Person('xiao',30);
// console.log(me);

//3. 不能使用 arguments 变量
// let fn = () => {
//     console.log(arguments);
// }
// fn(1,2,3);

//4. 箭头函数的简写
//1) 省略小括号, 当形参有且只有一个的时候
// let add = n => {
//     return n + n;
// }
// console.log(add(9));
//2) 省略花括号, 当代码体只有一条语句的时候, 此时 return 必须省略
// 而且语句的执行结果就是函数的返回值
let pow = (n) => n * n
// let num3 = (n) => return n-1;//报错
console.log(pow(8))
//箭头函数的代码块部分多于一条语句，
//就要使用大括号将它们括起来，并且使用 return 语句返回。
var sum = (num1, num2) => {
  num1 += 3
  return num1 + num2
}
// 如果箭头函数直接返回一个对象，必须在对象外面加上括号，否则会报错。
// let getStu = id => { id: id, name: "jack"};//报错
let getStu = (id) => ({ id: id, name: 'jack' }) //正确
console.log(sum(1, 1))
let fn = () => console.log('123')

var person = { first: 'asd', last: '123' }
// 箭头函数可以与变量解构结合使用
const full = ({ first, last }) => first + ' ' + last
console.log(full) //[Function: full]
// 等同于
// function full(person) {
//    return person.first + ' ' + person.last;
// }

// 箭头函数如果用了大括号 没用return 那么返回的就是一个对象
let x = 23
const num5 = () => {
  return x * 2
}
console.log(num5())//46
num5()
console.log(x)
